from collections.abc import Iterable

# 切片 [start?:end?:step?]  ? 可选  参数可以省 冒号:不能省
l = [1, 2, 3, 4, 5, 6, 7]
# l[0:3] 从索引0开始，取到3为止，不包括索引3
# 第一个索引是 0 的话可以省略
print(l[0:3])
print(l[:3])
print(l[1:2])
# 倒数切片
print(l[-1:])
print(l[-4:])  # 后四个数据
# []中第三个参数：步长
print(l[0:6:2])
# 所有数 每三个取一个
print(l[::3])
# [:] 可以原样复制一个list
# 元组tuple  字符串 同样可以使用切片操作


# 迭代  for...in...
# 字典dict  字符串  都可以迭代
# 判断是否可迭代 collections.abc 中的Iterable

print(isinstance("abc", Iterable))


# 列表生成式
l1 = [x * x for x in range(1, 11) if x % 2 == 0]
print(l1)
l2 = [m + n for m in "ABC" for n in "XYZ"]
print(l2)


# 生成器  generator
# 第一种  () 生成
g = (x for x in range(1, 10))
print(next(g))


# 第二种  函数中有 field 字段 可以把函数变成 generator函数
# 调用generator函数会创建generator对象，多次调用会创建多个对象，所以调用next方法要用generator对象
# generator函数执行时遇到yield就中断，下次继续执行
def fib(maxNum: int):
    n, a, b = 0, 0, 1
    while n < maxNum:
        yield b
        a, b = b, a + b
        n += 1
    return "down"


f = fib(6)
for m in f:
    print(m)

# 迭代器  可以被next()函数不断调用并返回下一个值的对象称为迭代器
# 生成器都是Iterator对象 可以用next
